/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package bdcgen.controleur;

import Vue.Vue;
import modele.BonDeCommande;
import modele.BonEnSaisie;
import modele.CriteresRecherche;
import modele.Modele;
import vue.VueFenetre;

/**
 *
 * @author Simon
 * Le controleur assure la transmission des instructions de l'interface au modèle.
 */
public class Controleur {

    private static Controleur controleur;
    //    Singleton, instance unique du controleur.
    private Vue vue;
    private Modele modele;

    public Controleur() {

        Controleur.controleur = this;
        this.modele = new Modele();
        this.vue = new Vue();
//        Instanciation du controleur, du modele et de la vue.
        this.modele.addObserver(vue);
//        La vue observe le modele.
        this.vue.init();
    }

    public static Controleur getInstance() {

        if (controleur == null) {
            return (new Controleur());
        } //        Si ce n'est pas déjà fait, on instancie le controleur.
        else {
            return controleur;
//        Dans tous les cas, un controleur est renvoyé.
        }
    }

    public void lancerScenario(Declencheur d) {
//        Lancement d'un scenario selon le type du declencheur.
//        Un cast est utilisé pour passer l'objet details du declencheur au modele.
//        L'objet details est forcément de la bonne classe avec la sélection par le type du déclencheur.
        switch (d.getType()) {
            case Declencheur.ENREGISTRER_BDC:
                this.modele.enregistrerBdc((BonEnSaisie)d.getDetails());
                break;
            case Declencheur.RECHERCHER_BDC:
                this.modele.rechercherBdc((CriteresRecherche)d.getDetails());
                break;
            case Declencheur.MODIFIER_BDC:
                this.modele.modifierBdc((BonDeCommande)d.getDetails());
                break;
            case Declencheur.GENERER_ODT:
                this.modele.genererOdt((BonDeCommande)d.getDetails());
                break;
        }
    }

    public Vue getVue() {
        return vue;
    }

}
